package notify

import (
	"context"
	"fmt"
	mHr "service/model/hr"
	mCache "service/model/hr_cache"
	"service/model/mod"
	model "service/model/notify"

	"strconv"
	"time"

	gpb "gitee.com/cloudapex/protos/crm_message/pb"
	usergpb "gitee.com/cloudapex/protos/hr/pb"
	gupb "gitee.com/cloudapex/protos/hr_cache/pb"
	"gitee.com/cloudapex/ulern/htp"
	"gitee.com/cloudapex/ulern/util"
	"github.com/gin-gonic/gin"
)

/*type InnMsgList struct {
	Id      int64  `form:"id" json:"id"`           //  内部通知ID
	CommpId int64  `form:"commpId" json:"commpId"` //  commpId 公司ID
	Title   string `form:"title" json:"title"`     //  title   标题
	Content string `form:"content" json:"content"` //  content 内容
	UserId  int64  `form:"userId" json:"userId"`   //  userId  创建者
	FileUrl string `form:"fileUrl" json:"fileUrl"` //  fileUrl 文件地址Url
	NoType  int64  `form:"noType" json:"noType"`   //  noType  通知类型 1 活动方案，2 人事调整， 3 工资绩效，4: 其他
	Status  int64  `form:"status" json:"status"`   //  status  消息状态 1 草稿, 2 发布，3 停用， 4 删除
	At      int64  `form:"at" json:"at"`
	At      int64  `form:"at" json:"at"`
	ShowId  []int64 `form:"showId" json:"showId"` //  可见范围ID 切片

}*/

type rspItem struct {
	Id        int64    `json:"id"`               //消息ID
	CommpId   int64    `json:"commpId"`          //公司ID
	Title     string   `json:"title"`            //标题
	Content   string   `json:"content"`          //内容
	UserId    int64    `json:"userId"`           //创建者
	FileUrl   string   `json:"fileUrl"`          //文件地址Url
	NoType    int64    `json:"noType"`           //通知类型 1 活动方案，2 人事调整， 3 工资绩效，4: 其他
	Status    int64    `json:"status"`           //消息状态 1 草稿, 2 发布，3 停用， 4 删除
	At        int64    `json:"at"`               //创建时间
	UserName  string   `json:"userName"`         //创建人
	ShowId    []uint64 `json:"showId,omitempty"` //组织切片
	ShowIdstr []string `json:"showIdstr"`        //组织切片string
	ShowName  string   `json:"showName"`         //范围名称
}

/*
 * 描述: 职能对接人员列表
 * 路由: /notify/adminInnmsgList
 * 方法: POST
 *********************************************************************/
type AdminInnMsgList struct {
	mod.SortFinder
	mod.PageFinder
	Title   string `form:"title" json:"title"`                        //  title   标题
	NoType  int64  `form:"noType" json:"noType" `                     //  noType  通知类型 1 活动方案，2 人事调整， 3 工资绩效，4: 其他
	Status  int64  `form:"status" json:"status" `                     //  status  消息状态 1 草稿, 2 发布，3 停用， 4 删除
	IsAdmin int64  `form:"isAdmin" json:"isAdmin" binding:"required"` //  isAdmin  是否是管理里员 1:否（业务） 2是（管理端）
}

func (this *AdminInnMsgList) Handle(c *gin.Context, ctx context.Context) htp.Response {
	jwtUser := mod.CurrUser(c)
	HIds := make([]int64, 0)
	HIds = append(HIds, jwtUser.HId)

	userCacheres, _ := mHr.StaffServer.GetStaffShows(ctx, &usergpb.StaffShowsReq{
		Hids: HIds,
	})

	rangUserList := make([]uint64, 0)
	if userCacheres != nil {
		for _, vuser := range userCacheres.StaffShows {
			rangUserList = append(rangUserList, vuser.ShowUIntId)
		}
	}

	var p_list *gpb.InNoticeListRes
	var err error
	compyListreq := &gpb.InNoticeListReq{
		Page:    int64(this.Page),
		Count:   int64(this.Pnum),
		Title:   this.Title,
		NoType:  this.NoType,
		Status:  this.Status,
		CommpId: jwtUser.CId,
		Order:   int64(this.Order),
		Orule:   int64(this.Orule + 1),
	}
	if this.IsAdmin == 2 {
		p_list, err = model.InnMsg.GetList(ctx, compyListreq)
	} else {
		compyListreq.ShowId = rangUserList
		p_list, err = model.InnMsg.InCrmNoticeList(ctx, compyListreq)
	}
	if p_list == nil || nil != err {
		return htp.RespOK("", &struct {
			Total int64       `json:"total"`
			List  interface{} `json:"list"`
		}{0, nil})
	}
	if p_list.Data == nil {
		return htp.RespOK("", &struct {
			Total int64       `json:"total"`
			List  interface{} `json:"list"`
		}{0, nil})
	}
	items := []rspItem{}
	if err := util.Convert(&items, p_list.Data); err != nil {
		return htp.RespConvertErr("", err)
	}
	//  设置数据中用户的名称和取值范围的名称
	items[0].RpcSetUserNameShowName(ctx, items)

	// 字符串处理
	for i, _ := range items {
		item := &items[i]
		for _, v := range item.ShowId {
			if v != 0 {
				item.ShowIdstr = append(item.ShowIdstr, fmt.Sprintf("%d", v))
			}
		}
		item.ShowId = nil
	}

	return htp.RespOK("", &struct {
		Total int64       `json:"total"`
		List  interface{} `json:"list"`
	}{p_list.Pager.Total, items})
}

/*
 * 描述: 添加内部通知
 * 路由: /notify/adminInnmsgAdd
 * 方法: POST
 *********************************************************************/
type AddInnMsg struct {
	Title     string   `form:"title" json:"title" binding:"required"`     //  title   标题
	Content   string   `form:"content" json:"content" binding:"required"` //  content 内容
	FileUrl   string   `form:"fileUrl" json:"fileUrl" `                   //  fileUrl 文件地址Url
	NoType    int64    `form:"noType" json:"noType" binding:"required"`   //  noType  通知类型 1 活动方案，2 人事调整， 3 工资绩效，4: 其他
	ShowId    []uint64 //  showId  可见范围
	ShowIdstr []string `form:"showId" json:"showId" binding:"required"` //  showId  可见范围

}

func (this *AddInnMsg) Handle(c *gin.Context, ctx context.Context) htp.Response {
	for _, v := range this.ShowIdstr {
		intNum, _ := strconv.Atoi(v)
		int64Num := uint64(intNum)
		this.ShowId = append(this.ShowId, int64Num)
	}

	jwtUser := mod.CurrUser(c)
	req := &gpb.InNoticeCreateReq{
		CommpId: jwtUser.CId,
		Title:   this.Title,
		Content: this.Content,
		UserId:  jwtUser.UId,
		FileUrl: this.FileUrl,
		NoType:  this.NoType,
		Status:  1,
		At:      time.Now().Unix(),
		ShowId:  this.ShowId,
	}
	res, err := model.InnMsg.Add(ctx, req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	if res.Status != 0 {
		return htp.RespErr(int(res.Status), "添加成功", nil)
	}
	return htp.RespOK("", "")
}

/*
 * 描述: 修改内部通知
 * 路由: /notify/adminInnmsgUp
 * 方法: POST
 *********************************************************************/
type UpInnMsg struct {
	Id        int64    `form:"id" json:"id"`                              //  内部通知ID
	Title     string   `form:"title" json:"title" binding:"required"`     //  title   标题
	Content   string   `form:"content" json:"content" binding:"required"` //  content 内容
	FileUrl   string   `form:"fileUrl" json:"fileUrl"`                    //  fileUrl 文件地址Url
	NoType    int64    `form:"noType" json:"noType" binding:"required"`   //  noType  通知类型 1 活动方案，2 人事调整， 3 工资绩效，4: 其他
	ShowId    []uint64 //  showId  可见范围
	ShowIdstr []string `form:"showId" json:"showId" binding:"required"` //  showId  可见范围
}

func (this *UpInnMsg) Handle(c *gin.Context, ctx context.Context) htp.Response {
	for _, v := range this.ShowIdstr {
		intNum, _ := strconv.Atoi(v)
		int64Num := uint64(intNum)
		this.ShowId = append(this.ShowId, int64Num)
	}

	jwtUser := mod.CurrUser(c)
	req := &gpb.InNoticeCreateReq{
		Id:      this.Id,
		CommpId: jwtUser.CId,
		Title:   this.Title,
		Content: this.Content,
		UserId:  jwtUser.UId,
		FileUrl: this.FileUrl,
		NoType:  this.NoType,
		ShowId:  this.ShowId,
	}
	res, err := model.InnMsg.Update(ctx, req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	if res.Status != 0 {
		return htp.RespErr(int(res.Status), "修改成功", nil)
	}
	return htp.RespOK("", "")
}

/*
 * 描述: 详情内部通知
 * 路由: /notify/adminInnmsgInfo
 * 方法: POST
 *********************************************************************/
type InfoInnMsg struct {
	Id int64 `form:"id" json:"id"` //  内部通知ID
}

func (this *InfoInnMsg) Handle(c *gin.Context, ctx context.Context) htp.Response {

	req := &gpb.InNoticeCreateReq{
		Id: this.Id,
	}
	_, err := model.InnMsg.Info(ctx, req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", "")
}

/*
 * 描述: 更新内部通知状态
 * 路由: /notify/adminInnmsgUpdateState
 * 方法: POST
 *********************************************************************/
type UpdateInnState struct {
	Ids    []int64 `form:"ids" json:"ids"`       //  内部通知ID
	Status int64   `form:"status" json:"status"` //1 草稿, 2 发布，3 停用， 4 删除
}

func (this *UpdateInnState) Handle(c *gin.Context, ctx context.Context) htp.Response {

	req := &gpb.InNoticeStatusReq{
		Ids:    this.Ids,
		Status: this.Status,
	}
	_, err := model.InnMsg.UpdateStatus(ctx, req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", "")
}

//**********************************************method*************************************************************

/*
	设置数据中用户的名称和取值范围的名称
*/
func (this *rspItem) RpcSetUserNameShowName(ctx context.Context, silVal []rspItem) error {
	//  对数据中的用户id和组织架构的id去重
	sil_user_id, sil_show_id := this.GetSUserIdSShowId(silVal)
	frawCache := &gupb.FullReqUIdsReq{
		Ids: sil_show_id,
	}

	frawCacheres, _ := mCache.FrameWorkCache.GetFraNameByShowIdList(ctx, frawCache)

	userCacheres, _ := mCache.UserCacheServer.UserNameList(ctx, &gupb.UserLoginReqIdsReq{
		Ids: sil_user_id,
	})

	for i, _ := range silVal {
		vo := &silVal[i]
		for _, vsid := range vo.ShowId {
			if frawCacheres != nil && len(frawCacheres.FullUList) > 0 {

				for _, vf := range frawCacheres.FullUList {
					if vsid == vf.Id && vf.FullName != "" {
						vo.ShowName += vf.FullName + ","

					}
				}
			}
		}
		vo.ShowName = mod.TrimLastChar(vo.ShowName)
		if userCacheres != nil && len(userCacheres.NameList) > 0 {

			for _, use := range userCacheres.NameList {
				if vo.UserId == use.Id {
					vo.UserName = use.Name
				}
			}
		}

	}

	return nil
}

/**
对数据中的用户id和组织架构的id去重
*/
func (this rspItem) GetSUserIdSShowId(silVal []rspItem) ([]int64, []uint64) {
	if 0 >= len(silVal) {
		return nil, nil
	}
	s_useid := make([]int64, 0)
	s_showid := make([]uint64, 0)
	for _, v := range silVal {
		fage := false
		for _, uv := range s_useid {
			if v.UserId == uv {
				fage = true
				break
			}
		}
		if !fage {
			s_useid = append(s_useid, v.UserId)
		}
		for si, _ := range v.ShowId {
			fage = false
			var ssi int = 0
			for ssi, _ = range s_showid {
				if v.ShowId[si] == s_showid[ssi] {
					fage = true
					break
				}
			}
			if !fage {
				s_showid = append(s_showid, v.ShowId[si])
			}
		}
	}
	return s_useid, s_showid
}
